
import 'package:amap_flutter_map/amap_flutter_map.dart';
import 'package:amap_flutter_location/amap_flutter_location.dart';
import 'package:permission_handler/permission_handler.dart';
import 'dart:async';
import 'dart:io';
import 'package:amap_flutter_location/amap_location_option.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'eventbus/EventBus.dart';
import 'eventbus/EventBusMethod.dart';


class AmpLocation{

  late AMapController mapController;
  late StreamSubscription<Map<String, Object>> locationListener;
  AMapFlutterLocation locationPlugin = AMapFlutterLocation();
  late Map<String, Object> locationResult;
  late Map currentLocation = {};

  AmpLocation._internal();
  factory AmpLocation()=>_instance;
  static final AmpLocation _instance = AmpLocation._internal();

  static AmpLocation getInstance(){
    return _instance;
  }

  init() async{
    /// [hasShow] 隐私权政策是否弹窗展示告知用户
    AMapFlutterLocation.updatePrivacyShow(true, true);
    /// [hasAgree] 隐私权政策是否已经取得用户同意
    AMapFlutterLocation.updatePrivacyAgree(true);

    /// 动态申请定位权限
    if(await (requestLocationPermission())){
      ///iOS 获取native精度类型
      if (Platform.isIOS) {
        requestAccuracyAuthorization();
      }
      locationResult = {};
      locationListener = locationPlugin
          .onLocationChanged()
          .listen((Map<String, Object> result) {
        currentLocation = result;
        //发布事件
        bus.emit(EventBusMethod.methods["实时定位事件"], result);
      });
    }else{
      EasyLoading.showError("定位权限被禁用,请授予应用定位权限");
    }


  }

   void setLocationOption(){
    if (null != locationPlugin) {
      AMapLocationOption locationOption =  AMapLocationOption();
      ///是否单次定位
      locationOption.onceLocation = false;

      ///是否需要返回逆地理信息
      locationOption.needAddress = true;


      ///逆地理信息的语言类型
      locationOption.geoLanguage = GeoLanguage.DEFAULT;

      locationOption.desiredLocationAccuracyAuthorizationMode =AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;

      locationOption.fullAccuracyPurposeKey = "AMapLocationScene";

      ///设置Android端连续定位的定位间隔
      locationOption.locationInterval = 5000;

      ///设置Android端的定位模式<br>
      ///可选值：<br>
      ///<li>[AMapLocationMode.Battery_Saving]</li>
      ///<li>[AMapLocationMode.Device_Sensors]</li>
      ///<li>[AMapLocationMode.Hight_Accuracy]</li>
      locationOption.locationMode = AMapLocationMode.Hight_Accuracy;

      ///设置iOS端的定位最小更新距离<br>
      locationOption.distanceFilter = -1;

      ///设置iOS端期望的定位精度
      /// 可选值：<br>
      /// <li>[DesiredAccuracy.Best] 最高精度</li>
      /// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
      /// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
      /// <li>[DesiredAccuracy.Kilometer] 1000米</li>
      /// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
      locationOption.desiredAccuracy = DesiredAccuracy.Best;

      ///设置iOS端是否允许系统暂停定位
      locationOption.pausesLocationUpdatesAutomatically = false;

      ///将定位参数设置给定位插件
      locationPlugin.setLocationOption(locationOption);
    }

  }

  ///退出页面要销毁
   void destroy(){
    ///移除定位监听
    if (null != locationListener) {
      locationListener.cancel();
    }

    ///销毁定位
    if (null !=locationPlugin) {
      locationPlugin.destroy();
    }
  }

  ///开始定位
   void startLocation() {
    if (null != locationPlugin) {
      ///开始定位之前设置定位参数
      setLocationOption();
      locationPlugin.startLocation();
    }
  }

  ///停止定位
   void stopLocation() {
    if (null != locationPlugin) {
      locationPlugin.stopLocation();
    }
  }

  /// 申请定位权限
  /// 授予定位权限返回true， 否则返回false
   Future<bool> requestLocationPermission() async {
    //获取当前的权限
    var status = await Permission.location.status;
    if (status == PermissionStatus.granted) {
      //已经授权
      return true;
    } else {
      //未授权则发起一次申请
      status = await Permission.location.request();
      if (status == PermissionStatus.granted) {
        return true;
      } else {
        return false;
      }
    }
  }


  ///获取iOS native的accuracyAuthorization类型
   void requestAccuracyAuthorization() async {
    AMapAccuracyAuthorization currentAccuracyAuthorization =
    await locationPlugin.getSystemAccuracyAuthorization();
    if (currentAccuracyAuthorization ==
        AMapAccuracyAuthorization.AMapAccuracyAuthorizationFullAccuracy) {
      print("精确定位类型");
    } else if (currentAccuracyAuthorization ==
        AMapAccuracyAuthorization.AMapAccuracyAuthorizationReducedAccuracy) {
      print("模糊定位类型");
    } else {
      print("未知定位类型");
    }
  }

  getCurrentLocation(){
    return currentLocation;
  }

}